/**
 * LLM WebSocket 连接工具
 * 用于连接 10.48.0.86:8091 获取假拟预报分析
 */

const LLM_WS_URL = 'wss://ws.waterism.tech:8091/ws'


/**
 * 创建 LLM WebSocket 连接
 * @param {string} sessionId - 会话ID
 * @param {Object} callbacks - 回调函数
 * @param {Function} callbacks.onMessage - 接收消息回调
 * @param {Function} callbacks.onOpen - 连接建立回调
 * @param {Function} callbacks.onError - 错误回调
 * @param {Function} callbacks.onClose - 连接关闭回调
 * @returns {WebSocket} WebSocket 实例
 */
export function connectLLMAnalysis(sessionId, callbacks = {}) {
  const {
    onMessage = () => {},
    onOpen = () => {},
    onError = () => {},
    onClose = () => {}
  } = callbacks

  console.log('🤖 [LLM WebSocket] 开始连接...')
  console.log('   URL:', LLM_WS_URL)
  console.log('   Session ID:', sessionId)

  try {
    const ws = new WebSocket(LLM_WS_URL)

    ws.onopen = () => {
      console.log('✅ [LLM WebSocket] 连接成功')
      console.log('   WebSocket URL:', LLM_WS_URL)
      console.log('   ReadyState:', ws.readyState)
      
      // 发送 session_id
      const messageObj = { session_id: sessionId }
      const message = JSON.stringify(messageObj)
      console.log('📤 [LLM WebSocket] 准备发送消息')
      console.log('   消息对象:', messageObj)
      console.log('   消息JSON字符串:', message)
      console.log('   Session ID:', sessionId)
      console.log('   消息长度:', message.length, '字节')
      
      ws.send(message)
      console.log('✅ [LLM WebSocket] 消息已发送')
      
      onOpen()
    }

    ws.onmessage = (event) => {
      console.log('📥 [LLM WebSocket] 接收到消息')
      console.log('   消息类型:', typeof event.data)
      console.log('   消息长度:', event.data.length, '字节')
      console.log('   消息内容 (原始):', event.data)
      
      try {
        // 尝试解析 JSON
        const data = JSON.parse(event.data)
        console.log('   ✅ JSON解析成功')
        console.log('   消息对象:', data)
        console.log('   消息类型字段 (type):', data.type)
        console.log('   消息内容字段:', Object.keys(data))
        onMessage(data, false) // false 表示是 JSON 数据
      } catch (e) {
        // 如果不是 JSON，作为纯文本处理
        console.log('   ⚠️ 非JSON格式，作为纯文本处理')
        console.log('   解析错误:', e.message)
        onMessage(event.data, true) // true 表示是文本数据
      }
    }

    ws.onerror = (error) => {
      console.error('❌ [LLM WebSocket] 连接错误')
      console.error('   错误对象:', error)
      console.error('   错误类型:', error.type)
      console.error('   ReadyState:', ws.readyState)
      console.error('   WebSocket URL:', LLM_WS_URL)
      onError(error)
    }

    ws.onclose = (event) => {
      console.log('🔌 [LLM WebSocket] 连接关闭')
      console.log('   关闭代码 (Code):', event.code)
      console.log('   关闭原因 (Reason):', event.reason || '无')
      console.log('   是否正常关闭 (Clean):', event.wasClean)
      console.log('   WebSocket URL:', LLM_WS_URL)
      console.log('   Session ID:', sessionId)
      onClose(event)
    }

    return ws
  } catch (error) {
    console.error('❌ [LLM WebSocket] 创建连接失败:', error)
    onError(error)
    return null
  }
}

/**
 * 关闭 WebSocket 连接
 * @param {WebSocket} ws - WebSocket 实例
 */
export function closeLLMConnection(ws) {
  if (ws && ws.readyState === WebSocket.OPEN) {
    console.log('🔌 [LLM WebSocket] 主动关闭连接')
    ws.close()
  }
}

/**
 * 重连 WebSocket
 * @param {string} sessionId - 会话ID
 * @param {Object} callbacks - 回调函数
 * @returns {WebSocket} 新的 WebSocket 实例
 */
export function reconnectLLMAnalysis(sessionId, callbacks) {
  console.log('🔄 [LLM WebSocket] 尝试重新连接...')
  return connectLLMAnalysis(sessionId, callbacks)
}

export default {
  connectLLMAnalysis,
  closeLLMConnection,
  reconnectLLMAnalysis
}

